package cn.bear.spring_boot_study.generator;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import com.baomidou.mybatisplus.generator.fill.Column;

import java.util.ArrayList;
import java.util.List;

/**
 * MyBatis-Plus 代码生成器
 * 
 * @author bear
 * @since 2024-01-01
 */
public class CodeGenerator {

    public static void main(String[] args) {
        String projectPath = System.getProperty("user.dir");
        
        FastAutoGenerator.create(GeneratorConfig.DB_URL, GeneratorConfig.DB_USERNAME, GeneratorConfig.DB_PASSWORD)
                .globalConfig(builder -> {
                    builder.author(GeneratorConfig.AUTHOR) // 设置作者
                              .outputDir(projectPath + "/src/main/java") // 指定输出目录
                              .dateType(DateType.ONLY_DATE); // 时间策略
                    if (!GeneratorConfig.OPEN_OUTPUT_DIR) {
                        builder.disableOpenDir(); // 禁止打开输出目录
                    }
                })
                .packageConfig(builder -> {
                    builder.parent(GeneratorConfig.PARENT_PACKAGE) // 设置父包名
                            .moduleName(GeneratorConfig.MODULE_NAME) // 设置模块名
                            .entity("entity") // 设置实体类包名
                            .mapper("mapper") // 设置Mapper接口包名
                            .service("service") // 设置Service接口包名
                            .serviceImpl("service.impl") // 设置Service实现类包名
                            .controller("controller") // 设置Controller包名
                            .pathInfo(java.util.Collections.singletonMap(
                                     OutputFile.xml,
                                     projectPath + "/src/main/resources/mapper/" + GeneratorConfig.MODULE_NAME + "/"
                             )); // 设置mapperXml生成路径
                })
                .strategyConfig(builder -> {
                    builder.addInclude(GeneratorConfig.TABLE_NAMES) // 设置需要生成的表名
                            .addTablePrefix(GeneratorConfig.TABLE_PREFIX) // 设置过滤表前缀
                            .entityBuilder()
                            .enableLombok() // 开启lombok模式
                            .enableTableFieldAnnotation() // 开启生成实体时生成字段注解
                            .naming(NamingStrategy.underline_to_camel) // 数据库表映射到实体的命名策略
                            .columnNaming(NamingStrategy.underline_to_camel) // 数据库表字段映射到实体的命名策略
                            .addTableFills(
                                    new Column("create_time", FieldFill.INSERT),
                                    new Column("update_time", FieldFill.INSERT_UPDATE)
                            ) // 添加表字段填充
                            .controllerBuilder()
                            .enableRestStyle() // 开启生成@RestController控制器
                            .enableHyphenStyle(); // 开启驼峰转连字符
                })
                // 使用默认模板引擎和模板
                .execute();
    }
}